const yapi = require('../yapi.js');
const baseModel = require('./base.js');

class interfaceModel extends baseModel {
    getName() {
        return 'interface';
    }

    getSchema() {
        return {
            title: { type: String, required: true },
            uid: { type: Number, required: true },
            path: { type: String, required: true },
            method: { type: String, required: true },
            project_id: { type: Number, required: true },
            catid: {type: Number, required: true},
            edit_uid: {type: Number, default: 0},
            status: {type: String, enum: ['undone', 'done'], default: 'undone'},
            desc: String,
            add_time: Number,
            up_time: Number,
            type: {type: String, enum: ['static', 'var'], default:'static'},
            query_path: {
                path: String,
                params: [{
                    name: String, value: String
                }],
            },
            req_query:[{
                name: String, value: String,example:String, desc: String, required: {
                    type:String,
                    enum: ["1", "0"],
                    default: "1"
                }
            }],
            req_headers: [{
                name: String, value: String,example:String, desc: String, required: {
                    type:String,
                    enum: ["1", "0"],
                    default: "1"
                }
            }],
            req_params:[{
                name: String,
                desc: String,
                example:String
            }],
            req_body_type: {
                type: String,
                enum: ['form', 'json', 'text', 'file', 'raw']
            },
            req_body_form: [{
                name: String,  type: { type: String, enum: ['text', 'file'] },example:String, desc: String, required: {
                    type:String,
                    enum: ["1", "0"],
                    default: "1"
                }
            }],
            req_body_other: String,
            res_body_type: {
                type: String,
                enum: ['json', 'text', 'xml', 'raw']
            },
            res_body: String
        };
    }

    save(data) {
        let m = new this.model(data);
        return m.save();
    }

    get(id) {
        return this.model.findOne({
            _id: id
        })
            .exec();
    }

    getBaseinfo(id){
        return this.model.findOne({
            _id: id
        }).select('path method uid title project_id cat_id status').exec()
    }

    getVar(project_id, method){
        return this.model.find({
            type: 'var',
            method: method
        }).select('_id path').exec()
    }

    getByQueryPath(project_id, path, method) {
        return this.model.find({
            project_id: project_id,
            "query_path.path": path,
            method: method
        })
            .exec();
    }

    getByPath(project_id, path, method) {
        return this.model.find({
            project_id: project_id,
            path: path,
            method: method
        })
            .exec();
    }

    checkRepeat(id, path, method) {
        return this.model.count({
            project_id: id,
            path: path,
            method: method
        });
    }

    countByProjectId(id) {
        return this.model.count({
            project_id: id
        });
    }

    list(project_id, select) {
        select = select || '_id title uid path method project_id catid edit_uid status desc add_time up_time'
        return this.model.find({
            project_id: project_id
        })
            .select(select)
            .sort({ _id: -1 })
            .exec();
    }

    listByCatid(catid){
        return this.model.find({
            catid: catid
        }).exec();
    }

    del(id) {
        return this.model.deleteOne({
            _id: id
        });
    }

    delByCatid(id){
        return this.model.deleteMany({
            catid: id
        })
    }

    delByProjectId(id){
        return this.model.deleteMany({
            project_id: id
        })
    }

    up(id, data) {
        data.up_time = yapi.commons.time();
        return this.model.update({
            _id: id
        }, data, {runValidators: true });
    }

    upEditUid(id, uid){
        return this.model.update({
            _id: id
        },
        {edit_uid: uid},
        {runValidators: true });
    }
}

module.exports = interfaceModel;
